\section{Temas del sistema operativo}

\subsection{Comunicación}
El proceso para compartir una carpeta entre el sistema host y la máquina virtual es bastante sencillo. Utilizamos el comando \textbf{mount} que permite montar un sistema de archivos para poder 
acceder a él. \\
Los pasos a seguir fueron hechos utilizando Ubuntu 9.10 como sistema host. Lo primero que haremos es crear una carpeta en algún lado en el host, que utilizaremos para comunicarnos con 
la máquina virtual. Una vez creada dicha carpeta, seleccionamos la máquina virtual, y en el menu \textit{Devices} (Dispositivos) elegimos la opción \textit{Shared folders} (Carpeas compartidas). 
Esta opción nos abrirá una ventana donde se presenta una lista de carpetas compartidas. Para agregar una nueva, simplemente elegimos la opción agregar. Allí elegimos el path de la carpeta, y el nombre 
que será visto por el sistema operavito en la máquina virtual. Por último podemos elegir la opción para que dicha carpeta quede permanentemente compartida.\\
Finalizado este paso, vamos a nuestra máquina virtual, y allí agregamos la siguiente línea:
\begin{verbatimtab}
 mount -t vboxsf shared_folder outworld -o uid=n, gid=m
\end{verbatimtab}
donde vboxsf indica que vamos a montar un sistema de archivos propio de virtual box. Puede ser que el comando mount no reconozca esta opción. En ese caso tendremos que instalar las guest additions provistas 
por virtual box que permiten entre otras cosas poder montar con esta opción. \textit{shared\_folder} es el nombre de la carpeta compartida que ve el sistema en la máquina virtual, y \textit{outworld} es 
algún directorio sobre el cual vamos a montar la carpeta compartida. Finalmente las opciones del final son para que monte los archivos y directorios con permisos para el usuario \textit{n}, y 
el grupo \textit{m}. En caso de querer poder modificar esos archivos, deberemos colocar el id de nuestro usuario.

\subsection{File system}
Los hardlinks crean enlaces al \textit{inodo} que contiene realmente el archivo. Los inodos son estructuras lógicas dentro de las cuales se almacena, entre otros datos, punteros a los bloques 
donde realmente reside la información del archivo. Además, los inodos contienen información sobre el archivo necesaria para el filesystem. Esta información esta definida en el estándar POSIX:
\begin{itemize}
    \item El identificador de dispositivo del dispositivo que alberga al sistema de archivos.
    \item El número de inodo que identifica al archivo dentro del sistema de archivos
    \item La longitud del archivo en bytes.
    \item El identificador de usuario del creador o un propietario del archivo con derechos diferenciados
    \item El identificador de grupo de un grupo de usuarios con derechos diferenciados
    \item El modo de acceso: capacidad de leer, escribir, y ejecutar el archivo por parte del propietario, del grupo y de otros usuarios.
    \item Las marcas de tiempo con las fechas de última modificación (mtime), acceso (atime) y de alteración del propio inodo (ctime).
    \item El número de enlaces, esto es, el número de nombres (entradas de directorio) asociados con este inodo.
\end{itemize}
Su estructura puede verse en la siguiente figura :
\begin{center}
  \includegraphics[totalheight=0.3\textheight]{./imagenes/inodo.png}
\end{center}

Un hardlink puede ser borrado sin afectar la existencia del archivo si es que existen otros hardlinks que siguen apuntando a ese inodo. En ese caso, el hardlink puede desaparecer sin problemas. 
Sólo cuando no existen hardlinks que sigan apuntando al inodo, éste es efectivamente destruído.

\subsection{Prioridades}
Para lograr lo pedido usaremos el comando \textbf{renice}. Dicho comando permite cambiar la prioridade ejecución.

Primero compilamos los programas y los ponemos a ejecutar
\begin{verbatimtab}
gcc -o loop loop.c
gcc -o loop2 loop.c
gcc -o loop3 loop.c 

./loop > /dev/null & 
./loop2 > /dev/null & 
./loop3 > /dev/null & 

ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S  1000  3902  3901  0  80   0 -  1201 -      tty1     00:00:04 bash
0 T  1000  5340  3902  0  80   0 -   859 -      tty1     00:00:00 nano
0 R  1000 10710  3902 24  80   0 -   391 -      tty1     00:00:34 loop
0 R  1000 10711  3902 23  80   0 -   391 -      tty1     00:00:32 loop2
0 R  1000 10712  3902 23  80   0 -   391 -      tty1     00:00:31 loop3
0 R  1000 10719  3902  0  80   0 -   607 -      tty1     00:00:00 ps
\end{verbatimtab}

Luego cambiamos la prioridad de loop3 para que ejecute más rápido
\begin{verbatimtab}
sudo renice -10 10712

ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S  1000  3902  3901  0  80   0 -  1201 -      tty1     00:00:05 bash
0 T  1000  5340  3902  0  80   0 -   859 -      tty1     00:00:00 nano
0 R  1000 10710  3902 18  80   0 -   391 -      tty1     00:02:04 loop
0 R  1000 10711  3902 17  80   0 -   391 -      tty1     00:02:03 loop2
0 R  1000 10712  3902 41  70 -10 -   391 -      tty1     00:04:45 loop3
0 R  1000 10747  3902  0  80   0 -   607 -      tty1     00:00:00 ps
\end{verbatimtab}

Luego haciendo un \textbf{top} podremos ver como loop3 utiliza el cpu mucho más que el resto de los procesos.

\subsection{Parámetros del kernel}
Para ver la cantidad de memoria del sistema hacemos lo siguiente

\begin{verbatimtab}
free -m

             total       used       free     shared    buffers     cached
Mem:           249        196         52          0         20        156
-/+ buffers/cache:         20        229
Swap:          235          0        235

\end{verbatimtab}

Para iniciar el kernel y que éste vea menos memoria, utilizaremos el parámentro \textit{mem}. Para ello editamos el archivo \textit{/boot/grub/menu.lst} agregando el parámetro mem como se muestra 
a continuación

\begin{scriptsize}
\begin{verbatimtab}
title		Ubuntu 8.04.3 LTS, kernel 2.6.24-24-virtual
root		(hd0,0)
kernel		/boot/vmlinuz-2.6.24-24-virtual root=UUID=482bb414-f918-4da2-8953-d609e02c7039 ro quiet splash mem=128M
initrd		/boot/initrd.img-2.6.24-24-virtual
quiet
\end{verbatimtab}
\end{scriptsize}
Una vez que reiniciemos nuestro sistema, podremos ver que sólo verá 128Mb en lugar de los 256Mb originales.

\begin{verbatimtab}
sudo reboot

...

free -m
             total       used       free     shared    buffers     cached
Mem:           122         30         92          0          2         14
-/+ buffers/cache:         13        109
Swap:          235          0        235
\end{verbatimtab}

\subsection{Administración de memoria}
Primero determinamos el tamaño actual de la partición swap utilizando nuevamente el comando \textbf{swapon}.

\begin{verbatimtab}
swapon -s

Filename				Type		Size	Used	Priority
/dev/sda5                               partition	240932	0	-1
\end{verbatimtab}
Ahora utilizaremos un archivo de tipo swap para extender nuestra partición swap. Para ello primero lo creamos de la siguiente forma
\begin{verbatimtab}
sudo dd if=/dev/zero of=/extraswap bs=1M count=512M
\end{verbatimtab}
Con el comando \textbf{dd} creamos un nuevo archivo de tamaño 100Mb lleno de 0's. 
\begin{verbatimtab}
sudo dd if=/dev/zero of=/extraswap bs=1024 count=102400
\end{verbatimtab}
Ahora le informamos al kernel que puede disponer del nuevo archivo para su uso como parte de la partición swap con el comando \textbf{mkswap}
\begin{verbatimtab}
sudo mkswap /extraswap
\end{verbatimtab}
Finalmente ejecutamos \textbf{swapon} para que el kernel empiece a usar el archivo
\begin{verbatimtab}
swapon /extraswap
\end{verbatimtab}
Ahora hemos incrementado la partición swap en 100mb
\begin{verbatimtab}
swapon -s

Filename				Type		Size	Used	Priority
/dev/sda5                               partition	240932	72	-1
/extraswap                              file		102392	0	-2
\end{verbatimtab}
Sin embargo si reiniciamos la máquina, perderemos los cambios hechos. Para hacer persistente el cambio deberemos modificar el archivo \textit{/etc/fstab} agregando la siguiente línea
\begin{verbatimtab}
/extraswap   none   swap   sw   0   0
\end{verbatimtab}
Listo. Ahora hemos incrementado el espacio swap en 100mb permanentemente.